Simple CalculatorΒΆ

[7]:
from tkinter import *
import parser
import math

root = Tk()
root.title("Calculator")

def tmp_cmd():
    text = display.get()
    if text:
        print(text)
    pass

def get_factorial(num):
    '''
    Factorial:
        n = n*(n-1)!
    '''
    if num == 0:
        return 0
    elif num == 1:
        return num
    else:
        return(num * get_factorial(num-1))

# position of the last character on display
pos = 0

def check_error_from_display():
    global pos
    if display.get() == "ERROR":
        clear_display()
        pos = 0

def put_digit(num):
    global pos
    check_error_from_display()
    display.insert(pos, num)
    pos += 1

def put_operator(operator):
    global pos
    check_error_from_display()
    display.insert(pos, operator)
    pos += len(operator)

def clear_display():
    global pos
    display.delete(0, END)
    pos = 0

def remole_last_digit():
    global pos
    check_error_from_display()
    if pos > 0:
        display.delete(pos-1)
        pos -= 1

def get_result():
    global pos
    statement = display.get()
    clear_display()
    if statement[-1:] == "!":
        # factorial: num must be integer and positive
        num = int(float(statement[:-1]))
        if num > 0:
            result = get_factorial(num)
            display.insert(0, result)
            pos = len(str(result)) + 1
        else:
            display.insert(0, "ERROR")
    else:
        try:
            prep = parser.expr(statement).compile()
            result = eval(prep)
            display.insert(0, result)
            pos = len(str(result)) + 1
        except Exception:
            display.insert(0, "ERROR")

display = Entry(root)
display.grid(row=1, columnspan=6, sticky=W+E, pady=4)

btn_widh = 5
func_btn_color = "#F9A602"

Button(text="1",  width=btn_widh, command=lambda: put_digit(1)).grid(row=2, column=0)
Button(text="2",  width=btn_widh, command=lambda: put_digit(2)).grid(row=2, column=1)
Button(text="3",  width=btn_widh, command=lambda: put_digit(3)).grid(row=2, column=2)

Button(text="4",  width=btn_widh, command=lambda: put_digit(4)).grid(row=3, column=0)
Button(text="5",  width=btn_widh, command=lambda: put_digit(5)).grid(row=3, column=1)
Button(text="6",  width=btn_widh, command=lambda: put_digit(6)).grid(row=3, column=2)

Button(text="7",  width=btn_widh, command=lambda: put_digit(7)).grid(row=4, column=0)
Button(text="8",  width=btn_widh, command=lambda: put_digit(8)).grid(row=4, column=1)
Button(text="9",  width=btn_widh, command=lambda: put_digit(9)).grid(row=4, column=2)

Button(text="AC", width=btn_widh, command=clear_display, bg=func_btn_color).grid(row=5, column=0)
Button(text="0",  width=btn_widh, command=lambda: put_digit(0)).grid(row=5, column=1)
Button(text="=",  width=btn_widh, command=lambda: get_result(), bg=func_btn_color).grid(row=5, column=2)

Button(text="+",  width=btn_widh, command=lambda: put_operator("+"), bg=func_btn_color).grid(row=2, column=3)
Button(text="-",  width=btn_widh, command=lambda: put_operator("-"), bg=func_btn_color).grid(row=3, column=3)
Button(text="*",  width=btn_widh, command=lambda: put_operator("*"), bg=func_btn_color).grid(row=4, column=3)
Button(text="/",  width=btn_widh, command=lambda: put_operator("/"), bg=func_btn_color).grid(row=5, column=3)

Button(text="pi",  width=btn_widh, command=lambda: put_operator("3.14"),  bg=func_btn_color).grid(row=2, column=4)
Button(text="%",   width=btn_widh, command=lambda: put_operator("%"),      bg=func_btn_color).grid(row=3, column=4)
Button(text="(",   width=btn_widh, command=lambda: put_operator("("),      bg=func_btn_color).grid(row=4, column=4)
Button(text="exp", width=btn_widh, command=lambda: put_operator("**"),     bg=func_btn_color).grid(row=5, column=4)

Button(text="<-",  width=btn_widh, command=lambda: remole_last_digit(), bg=func_btn_color).grid(row=2, column=5)
Button(text="x!",  width=btn_widh, command=lambda: put_operator("!"), bg=func_btn_color).grid(row=3, column=5)
Button(text=")",   width=btn_widh, command=lambda: put_operator(")"), bg=func_btn_color).grid(row=4, column=5)
Button(text="^2",  width=btn_widh, command=lambda: put_operator("**2"), bg=func_btn_color).grid(row=5, column=5)

[root.grid_rowconfigure(row, pad=4, minsize=24) for row in range(2,6)]
[root.grid_columnconfigure(col, pad=4, minsize=24) for col in range(0,6)]

# root.mainloop()
[7]:
[None, None, None, None, None, None]

Calculator